// 题目二：4 位二进制加法器设计
// 设计一个 4 位无符号二进制加法器模块，不能直接使用“+”运算符：
// 1
// module adder4 (
// 2
// input wire [3:0] a,
// 3
// input wire [3:0] b,
// 4
// output wire [4:0] sum
// 5
// );
// Listing 2: 4 位加法器模块接口
// • 使用组合逻辑结构（assign 语句或基本门电路）实现；
// • 提供测试平台验证功能正确性；
// • 不可以使用内建“+”符号。



//先设计一个全加器
module full_add(
    input wire a, //输入1
    input wire b, //输入2
    input wire tmp_in, //输入的进位
    output wire sum, //这一位上的和
    output wire tmp_out //下一位的进位
);

    //wire类型只能驱动产生值 连续赋值或assign语句
    assign sum = a^b^tmp_in; //三者的异或即为这一位加法的结果
    assign tmp_out = (a&b) | (b&tmp_in) | (a&tmp_in); //产生下一位的进位


endmodule



//4位加法器
module adder4(
    input wire[3:0] a,
    input wire[3:0] b,
    input wire tmp_in,
    output wire[4:0] sum,
    output wire tmp_out
);

    wire tmp1,tmp2,tmp3;//声明三个变量接收进位输出

    //调用全加器模块
    full_add f0(
        .a(a[0]),
        .b(b[0]),
        .tmp_in(tmp_in),
        .sum(sum[0]),
        .tmp_out(tmp1)
    );

    full_add f1(
        .a(a[1]),
        .b(b[1]),
        .tmp_in(tmp1),
        .sum(sum[1]),
        .tmp_out(tmp2)
    );

    full_add f2(
        .a(a[2]),
        .b(b[2]),
        .tmp_in(tmp2),
        .sum(sum[2]),
        .tmp_out(tmp3)
    );

    full_add  f3(
        .a(a[3]),
        .b(b[3]),
        .tmp_in(tmp3),
        .sum(sum[3]),
        .tmp_out(sum[4])
    );


endmodule





`timescale 1ns/100ps
//测试
//testbench of adder4
module adder4_tb;
    reg[3:0] a;
    reg[3:0] b;
    reg tmp_in;
    wire[4:0] sum;
    wire tmp_out;

    adder4 adder4(
        .a(a),
        .b(b),
        .tmp_in(tmp_in),
        .sum(sum),
        .tmp_out(tmp_out)
    );

    initial begin
        a = 4'b0000; b = 4'b0000; tmp_in = 0;
    #10 a = 4'b0001; b = 4'b0001; tmp_in = 0;
    #10 a = 4'b0010; b = 4'b0001; tmp_in = 1;
    #10 a = 4'b1001; b = 4'b1010; tmp_in = 0;
    #10 $stop;
    end

endmodule